Náhodou jsem spáchal nesprávné soubory na Git, ale ještě jsem nevytlačil potvrzení na server. Jak mohu zrušit tyto závazky z místního úložiště?
1 2 3 další Vrátit zpět potvrzení a znovu $ git commit -m "Něco strašně zavádějícího" # (0: Vaše nehoda) $ git reset HEAD ~ # (1) << upravte soubory podle potřeby >> # (2) $ git přidat. # (3) $ git commit -c ORIG_HEAD # (4) Tento příkaz je zodpovědný za vrácení zpět. Vrátí zpět vaše poslední potvrzení a ponechá váš pracovní strom (stav vašich souborů na disku) nedotčený. Budete je muset znovu přidat, než je budete moci znovu potvrdit). Provádějte opravy souborů pracovního stromu. git přidejte vše, co chcete zahrnout do svého nového odevzdání. Potvrďte změny a znovu použijte starou zprávu o odevzdání. reset zkopíroval starou hlavu do .git / ORIG_HEAD; potvrzení s -c ORIG_HEAD otevře editor, který zpočátku obsahuje zprávu protokolu ze starého potvrzení a umožňuje ji upravit. Pokud zprávu nepotřebujete upravovat, můžete použít volbu -C. Alternativně k úpravě předchozího potvrzení (nebo jen jeho zprávy o potvrzení), commit --amend přidá změny v aktuálním indexu k předchozímu potvrzení. Chcete-li odebrat (nevrátit) potvrzení, které bylo odesláno na server, je nutné přepsat historii pomocí git push origin master --force. Další čtení Jak mohu přesunout HEAD zpět na předchozí místo? (Oddělená hlava) & Vrátit zpět Výše uvedená odpověď vám ukáže git reflog, který můžete použít k určení SHA-1 pro potvrzení, ke kterému se chcete vrátit. Jakmile máte tuto hodnotu, použijte posloupnost příkazů, jak je vysvětleno výše. HEAD ~ je stejný jako HEAD ~ 1. Článek What is the HEAD in git? je užitečné, pokud chcete zrušit více závazků. | Zrušení odevzdání je trochu děsivé, pokud nevíte, jak to funguje. Ale je to ve skutečnosti neuvěřitelně snadné, pokud tomu rozumíte. Ukážu vám 4 různé způsoby, jak můžete zrušit potvrzení. možnost 1: git reset --hard Řekněme, že to máte, kde C je vaše HLAVA a (F) je stav vašich souborů. (F) A-B-C ↑ mistr Chcete nuke spáchat C a už to nikdy neuvidíte a ztratíte všechny změny v lokálně upravených souborech. Uděláte to: git reset --hard HEAD ~ 1 Výsledek je: (F) A-B ↑ mistr Nyní B je HLAVA. Protože jste použili --hard, obnoví se vaše soubory do stavu při potvrzení B. možnost 2: reset git Ah, ale předpokládejme, že spáchání C nebyla katastrofa, ale jen trochu pryč. Chcete zrušit potvrzení, ale ponechte si změny pro trochu úprav, než uděláte lepší potvrzení. Počínaje tímto odsud, s C jako HLAVA: (F) A-B-C ↑ mistr Můžete to udělat tak, že vypnete --hard: git reset HEAD ~ 1 V tomto případě je výsledek: (F) A-B-C ↑ mistr V obou případech je HEAD pouze ukazatel na nejnovější potvrzení. Když provedete git reset HEAD ~ 1, řeknete Git, aby přesunul ukazatel HEAD zpět o jeden potvrzení. Ale (pokud nepoužíváte --hard) necháte soubory tak, jak byly. Takže nyní stav git ukazuje změny, které jste zkontrolovali do C. Neztratili jste nic! možnost 3: git reset --soft Nejlehčí dotek můžete dokonce vrátit zpět, ale ponechat soubory a index: git reset --soft HEAD ~ 1 To nejenže ponechává vaše soubory samotné, ale dokonce i samotný index. Když uděláte git status, uvidíte, že v indexu jsou stejné soubory jako dříve. Ve skutečnosti můžete hned po tomto příkazu provést git commit a předělat stejný commit, jaký jste právě měli. možnost 4: provedli jste git reset --hard a potřebujete tento kód získat zpět Ještě jedna věc: Předpokládejme, že zničíte revizi jako v prvním příkladu, ale pak zjistíte, že jste ji nakonec potřebovali? Těžké štěstí, že? Ne, stále existuje způsob, jak to získat zpět. Zadejte git reflog a uvidíte seznam (částečných) shas shasů (tj. Hashů), ve kterých jste se pohybovali. Najděte spáchaný příkaz, který jste zničili, a proveďte toto: git checkout -b someNewBranchName shaYouDestroyed Nyní jste ten vzkříšení vzkřísil. Závazky se ve skutečnosti na Gitu nezničí asi 90 dní, takže se obvykle můžete vrátit a zachránit ten, kterého jste se nechtěli zbavit. | Existují dva způsoby, jak „vrátit“ poslední potvrzení, v závislosti na tom, zda jste již svůj závazek zveřejnili (odeslali do vzdáleného úložiště): Jak vrátit místní potvrzení Řekněme, že jsem se zavázal místně, ale teď chci tento závazek odstranit. git log commit 101: bad commit # Poslední potvrzení. Toto by se nazývalo „HLAVA“. commit 100: good commit # Druhý k poslednímu potvrzení. To je ten, který chceme. Chcete-li obnovit vše zpět na způsob, jakým to bylo před posledním potvrzením, musíme resetovat na potvrzení před HEAD: git reset --soft HEAD ^ # Použijte --soft, pokud chcete zachovat změny git reset --hard HEAD ^ # Použijte --hard, pokud vám nezáleží na zachování provedených změn Nyní git log ukáže, že náš poslední revize byla odstraněna. Jak zrušit veřejné potvrzení Pokud jste již své závazky zveřejnili, budete chtít vytvořit nový závazek, který „vrátí“ změny provedené v předchozím potvrzení (aktuální HEAD). git revert HEAD Vaše změny budou nyní vrácenya jste připraveni spáchat: git commit -m 'obnovení souboru, který jsem omylem odstranil' git log spáchat 102: obnovení souboru, který jsem omylem odstranil spáchat 101: odstranění souboru, který nepotřebujeme spáchat 100: přidání souboru, který potřebujeme Další informace najdete v Git Basics - Undoing Things. | Přidáním / odebráním souborů získáte věci tak, jak chcete: git rm classdir git přidejte zdroj Poté upravte potvrzení: git commit --amend Předchozí chybné potvrzení bude upraveno tak, aby odráželo nový stav indexu - jinými slovy, bude to, jako byste nikdy neudělali chybu na prvním místě. Mějte na paměti, že byste to měli dělat, pouze pokud jste ještě netlačili. Pokud jste tlačili, pak budete muset provést opravu normálně. | git rm yourfiles / *. třída git commit -a -m "smazal všechny soubory třídy ve složce 'yourfiles'" nebo git reset --hard HEAD ~ 1 Varování: Výše uvedený příkaz trvale odstraní úpravy souborů .java (a všech dalších souborů), které jste chtěli potvrdit. Tvrdý reset na HEAD-1 nastaví vaši pracovní kopii do stavu odevzdání před chybným odevzdáním. | Chcete-li změnit poslední potvrzení Nahraďte soubory v indexu: git rm --cached * .class git přidat * .java Pokud je to soukromá pobočka, upravte potvrzení: git commit --amend Nebo pokud je to sdílená větev, proveďte nové potvrzení: git commit -m 'Nahradit soubory .class soubory .java' (Chcete-li změnit předchozí potvrzení, použijte úžasnou interaktivní rebase.) ProTip ™: Přidejte * .class do gitignore a zastavte to znovu. Chcete-li vrátit potvrzení Úprava potvrzení je ideálním řešením, pokud potřebujete změnit poslední potvrzení, ale obecnější řešení se resetuje. Git můžete resetovat na jakékoli potvrzení pomocí: git reset @ ~ N Kde N je počet potvrzení před HEAD a @ ~ se resetuje na předchozí potvrzení. Takže místo změny potvrzení můžete použít: git reset @ ~ git přidat * .java git commit -m "Přidat soubory .java" Podívejte se na resetování nápovědy git, konkrétně v částech --soft --mixed a --hard, abyste lépe pochopili, co to dělá. Reflog Pokud se pokazíte, můžete vždy použít reflog k nalezení zrušených závazků: $ git reset @ ~ $ git reflog c4f708b HEAD @ {0}: reset: moving to @ ~ 2c52489 HEAD @ {1}: commit: přidáno několik souborů .class $ git reset 2c52489 ... a jste zpátky tam, kde jste začali | Použijte git revert. Chcete-li získat ID potvrzení, stačí použít git log. | Pokud plánujete úplně zrušit místní potvrzení, ať už provedete cokoli, co jste při provádění provedli, a pokud si s tím nebudete dělat starosti, udělejte následující příkaz. git reset --hard HEAD ^ 1 (Tento příkaz bude ignorovat celé vaše potvrzení a vaše změny budou z místního pracovního stromu zcela ztraceny). Chcete-li vrátit své odevzdání, ale chcete své změny v pracovní oblasti (před odevzdáním stejně jako po přidání git), proveďte následující příkaz. git reset --soft HEAD ^ 1 Nyní se vaše potvrzené soubory dostanou do pracovní oblasti. Předpokládejme, že chcete-li soubory vylepšit, protože potřebujete upravit nějaký nesprávný obsah, proveďte následující příkaz git reset HEAD Nyní potvrzené soubory pocházejí ze stupňovité oblasti do nestádiované oblasti. Nyní jsou soubory připraveny k úpravám, takže ať změníte cokoli, budete chtít úpravy upravit a přidat a provést nový / nový odevzdání. Více (nefunkční odkaz) (archivovaná verze) | Pokud máte nainstalovaný Git Extras, můžete spustit git undo a vrátit tak poslední potvrzení. git undo 3 zruší poslední tři revize. | Chtěl jsem vrátit posledních pět revizí v našem sdíleném úložišti. Vyhledal jsem ID revize, ke kterému jsem se chtěl vrátit. Pak jsem zadal následující. prompt> git reset --hard 5a7404742c85 HEAD je nyní na 5a74047 Přidána další stránka do katalogu prompt> git push origin master --force Celkem 0 (delta 0), znovu použito 0 (delta 0) remote: bb / acl: neoneye je povoleno. přijaté užitečné zatížení. Na adresu git@bitbucket.org: thecompany / prometheus.git + 09a6480 ... 5a74047 hlavní -> hlavní (vynucená aktualizace) výzva> | Dávám přednost použití git rebase -i pro tuto práci, protože se objeví pěkný seznam, kde si mohu vybrat závazky, kterých se zbavím. Možná to nebude tak přímé jako u některých jiných odpovědí, ale je to prostě v pořádku. Vyberte, kolik revizí chcete vypsat, a poté je vyvolejte takto (pro získání posledních tří) git rebase -i HLAVA ~ 3 Ukázkový seznam vyberte aa28ba7 Sanity check for RtmpSrv port vyberte možnost verze c26c541 RtmpSrv vybrat 58d6909 Lepší podpora dekódování URL Poté Git odstraní závazky ze všech řádků, které odeberete. | Jak opravit předchozí místní potvrzení Pomocí git-gui (nebo podobného) proveďte git commit --amend. Z grafického uživatelského rozhraní můžete přidat nebo odebrat jednotlivé soubory z potvrzení. Můžete také upravit zprávu o potvrzení. Jak vrátit předchozí místní potvrzení Stačí resetovat větev na předchozí umístění (například pomocí gitk nebo git rebase). Poté znovu uložte změny z uložené kopie. Po odvozu odpadu ve vašem místním úložišti to bude jako kdyby se nechtěné potvrzení nikdy nestalo. Chcete-li to udělat v jediném příkazu, použijte git reset HEAD ~ 1. Slovovarování: Neopatrné použití git reset je dobrý způsob, jak dostat svou pracovní kopii do matoucího stavu. Doporučuji, aby se tomu začátečníci Gitu vyhýbali, pokud mohou. Jak zrušit veřejné potvrzení Chcete-li změny vrátit zpět, proveďte reverzní výběr třešní (git-revert). Pokud jste do své pobočky dosud nestáhli další změny, můžete jednoduše udělat ... git revert --no-edit HEAD Poté posuňte aktualizovanou větev do sdíleného úložiště. Historie revizí zobrazí obě revize zvlášť. Pokročilé: Oprava soukromé pobočky ve veřejném úložišti To může být nebezpečné - ujistěte se, že máte lokální kopii pobočky, kterou chcete přepsat. Poznámka: Toto nechcete dělat, pokud na pobočce pracuje někdo jiný. git push --delete (branch_name) ## odebrat veřejnou verzi větve Vyčistěte svou pobočku lokálně a poté ji ... git push origin (název_větve) V normálním případě si pravděpodobně nemusíte dělat starosti s tím, že by historie historie vaší soukromé pobočky byla nedotčená. Stačí stisknout následné potvrzení (viz výše „Jak zrušit veřejné potvrzení“) a později skrýt historii hromadným sloučením. | Pokud to chcete trvale vrátit zpět a naklonovali jste nějaké úložiště ID potvrzení lze zobrazit pomocí git log Pak můžete udělat - git reset --hard git push origin -f | Pokud jste se dopustili haraburdí, ale ne tlačili, git reset --soft HEAD ~ 1 HEAD ~ 1 je zkratka pro potvrzení před hlavou. Alternativně se můžete podívat na SHA-1 hash, pokud se chcete resetovat. Možnost --soft odstraní potvrzení, ale ponechá všechny vaše změněné soubory „Změny, které mají být potvrzeny“, jak by to řekl stav git. Chcete-li se zbavit jakýchkoli změn sledovaných souborů v pracovním stromu od potvrzení před hlavou, použijte místo toho „--hard“. NEBO Pokud jste již tlačili a někdo táhl, což je obvykle můj případ, nemůžete použít git reset. Můžete však udělat git revert, git revert HEAD Tím se vytvoří nový závazek, který obrátí vše, co bylo zavedeno náhodným spácháním. | Na SourceTree (GUI pro GitHub) můžete kliknout pravým tlačítkem na potvrzení a provést „reverzní potvrzení“. To by mělo vrátit zpět vaše změny. Na terminálu: Můžete také použít: git vrátit Nebo: git reset --soft HEAD ^ # Použijte --soft, pokud chcete zachovat změny. git reset --hard HEAD ^ # Použijte --hard, pokud vám nezáleží na zachování vašich změn. | Jediný příkaz: git reset --soft 'HEAD ^' Funguje skvěle k vrácení posledního místního potvrzení! | Stačí jej resetovat pomocí níže uvedeného příkazu pomocí git: git reset --soft HEAD ~ 1 Vysvětlete: co git reset dělá, je to v podstatě resetováno na jakýkoli závazek, ke kterému se chcete vrátit, pak pokud to zkombinujete s klíčem --soft, vrátí se zpět, ale ponechte změny ve vašich souborech, takže vrátíte se do fáze, do které byl soubor právě přidán, HEAD je vedoucí pobočky a pokud zkombinujete s ~ 1 (v tomto případě použijete také HEAD ^), vrátí se zpět jen jeden závazek, který chcete. .. Kroky na obrázku níže vytvářím podrobněji pro vás, včetně všech kroků, které se mohou stát ve skutečných situacích a spáchání kódu: | Jak vrátit poslední potvrzení Git? Abychom vše obnovili zpět na způsob před posledním odevzdáním, musíme resetovat na odevzdání před HEAD. Pokud si nechcete ponechat provedené změny: git reset --hard HEAD ^ Pokud si chcete ponechat změny: git reset --soft HEAD ^ Nyní zkontrolujte svůj git log. Ukáže, že náš poslední závazek byl odstraněn. | "Obnovit pracovní strom na poslední potvrzení" git reset --hard HEAD ^ "Vyčistit neznámé soubory z pracovního stromu" git čistý viz - Git Quick Reference POZNÁMKA: Tento příkaz odstraní předchozí potvrzení, proto jej používejte opatrně! git reset --hard je bezpečnější. | Použijte reflog k nalezení správného stavu git reflog PŘED RESETEM REFLOGUJTE Vyberte správný reflog (v mém případě f3cb6e2) a zadejte git reset --hard f3cb6e2 Poté bude repo HEAD resetováno na tento HEADid PŘIHLÁSIT SE PO RESETU Nakonec reflog vypadá jako na obrázku níže REFLOG FINÁLNÍ | První běh: git reflog Ukáže vám všechny možné akce, které jste provedli ve svém úložišti, například potvrzení, sloučení, stažení atd. Pak proveďte: git reset --hard ActionIdFromRefLog | Vrátit poslední potvrzení: git reset --soft HEAD ^ nebo git reset --soft HEAD ~ Tím se zruší poslední potvrzení. Tady --soft znamená reset do fáze. HEAD ~ nebo HEAD ^ znamená přesunout se dopustit před HEAD. Nahradit poslední potvrzení novým potvrzením: git commit --amend -m "zpráva" Nahradí poslední potvrzení novým potvrzením. | Jiná cesta: Podívejte se na větev, kterou chcete vrátit, a poté obnovte místní pracovní kopii zpět na potvrzení, že chcete být nejnovější na vzdáleném serveru (vše poté, co se rozloučí). K tomu jsem v SourceTree kliknul pravým tlačítkem na a zvolil „Obnovit BRANCHNAME na toto potvrzení“. Poté přejděte do místního adresáře úložiště a spusťte tento příkaz: git -c diff.mnemonicprefix = false -c core.quotepath = false push -v -f --tags REPOSITORY_NAMEBRANCHNAME: BRANCHNAME To vymaže všechny závazky po aktuálním ve vašem místním úložišti, ale pouze pro tuto jednu větev. | Zadejte git log, najděte poslední hash kód a poté zadejte: git reset | V mém případě jsem omylem spáchal nějaké soubory, které jsem nechtěl. Udělal jsem tedy následující a fungovalo to: git reset --soft HEAD ^ git rm --cached [soubory, které nepotřebujete] git přidat [soubory, které potřebujete] git commit -c ORIG_HEAD Výsledky ověřte pomocí gitk nebo git log --stat | Jednoduché, spusťte to na příkazovém řádku: git reset --soft HEAD ~ | Existují dva hlavní scénáře Zatím jste nevytlačili potvrzení Pokud problémem byly další soubory, které jste spáchali (a nechcete, aby byly v úložišti), můžete je odstranit pomocí git rm a poté potvrdit pomocí --amend git rm
Můžete také odstranit celé adresáře pomocí -r nebo dokonce kombinovat s jinými příkazy Bash git rm -r git rm $ (najít -name '* .class') Po odebrání souborů můžete provést potvrzení pomocí možnosti --amend git commit --amend -C HEAD # Možnost -C je použít stejnou zprávu potvrzení Tím se přepíše váš nedávný lokální odevzdání odebrání nadbytečných souborů, takže tyto soubory nebudou nikdy odeslány na push a také budou odstraněny z vašeho místního úložiště .git GC. Již jste stiskli potvrzení Můžete použít stejné řešení z druhého scénáře a poté provést git push s volbou -f, ale nedoporučuje se to, protože přepíše vzdálenou historii s odlišnou změnou (může poškodit vaše úložiště). Místo toho musíte provést potvrzení bez --amend (pamatujte na toto o -amend`: Tato možnost přepíše historii posledního potvrzení). | Pro místní potvrzení git reset --soft HEAD ~ 1 nebo pokud si nepamatujete přesně, ve kterém spáchání je, můžete použít git rm --cached Za tlačené potvrzení Správný způsob odstraňování souborů z historie úložiště je pomocí git filter-branch. To znamená git filter-branch --index-filter 'git rm --cached ' HEAD Ale doporučuji vám používat tento příkaz opatrně. Přečtěte si více na stránce git-filter-branch (1) Manual. | Chcete-li obnovit předchozí revizi, trvale smažete všechny nepotvrzené změny: git reset --hard HEAD ~ 1 | CO POUŽÍVAT, resetovat - soft nebo reset - hard? Jen přidávám dva centy za odpověď @ Kyralessa: Pokud si nejste jisti, co použít, přejděte na --soft (tuto konvenci jsem si zapamatoval --soft pro jistotu). Proč? Pokud se rozhodnete - tvrdě omylem, ZTRACÍTE své změny, jako tomu nebylo dříve. Pokud omylem zvolíte --soft, můžete dosáhnout stejných výsledků --hard použitím dalších příkazů git reset HEAD file.html git checkout - file.html Celý příklad echo "některé změny ..."> file.html git přidat soubor.html git commit -m "špatné potvrzení" # Musím resetovat git reset --hard HEAD ~ 1 (zrušit změny) # NEBO git reset --soft HEAD ~ 1 # Zpět na pracovní verzi git reset HEAD file.html # zpět do pracovního adresáře git checkout - file.html # zrušit změny Kredity jde do @Kyralessa. | 1 2 3 další Vysoce aktivní otázka. Získejte 10 reputace, abyste mohli odpovědět na tuto otázku. Požadavek na reputaci pomáhá chránit tuto otázku před spamem a neodpovědností. Toto není odpověď, kterou hledáte? Přečtěte si další otázky týkající se značek git version-control git-commit undo nebo položte vlastní otázku.